package com.fqcheng220.tools.babynamer;

/**
 * 来源  https://m.sohu.com/a/516074526_121067122
 * 1）谢咏老师谈：五格的计算方法
 * <p>
 * 姓名学中的五格是：天格、人格、地格、总格、外格等五格，其计算方法如下：
 * <p>
 * 1、天格：天格数是先祖留传下来的，其数理对人影响不大。
 * <p>
 * 单姓和复姓计算天格数理是不同的。单姓的天格数理是“单姓笔画+1“，而复姓的天格数理是“复姓笔画数相加“。例如：“丁“姓的天格数理是3(丁2画+1)，“田“姓的天格数理是6(田5画+1)；“司马“姓氏的天格数理是15(司5画+马10画)，“欧阳“复姓的天格数理是32(欧15画+阳17画)。因为天格是由姓氏决定的，所以在姓名学中不能单纯依天格数理论吉凶。
 * <p>
 * 2、人格：人格数又称主运，是整个姓名的中心点，影响人的一生命运。
 * <p>
 * 单姓的人格数理是“姓的笔画数+名(第一字)的笔画数“，如“刘德华“之名的人格数理是30 (刘15画+德15画)；复姓的人格数理是“复姓的第二个字笔画+名的第一个字笔画“，如“司马光“之名人格数理是16(马10画+光6画)，“东方长红“之名的人格数理是12(方4画+长8画)。
 * <p>
 * 3、地格：地格数又称前运，影响人中年以前的活动力。
 * <p>
 * 单姓和复姓的地格数理都是“名字的笔画数相加“，如单姓双名“刘德华“的地格数理是29(德15画+华14画)；复姓双名“东方长红“的地格数理是17(长8画+红9画)。单名(如：王华、司马光)又该如何计算地格数理呢?单名的地格数理是“名的笔画数+1“，即“王华“的地格是16(华15画+1)，“司马光“的地格数理是7(光6画+1)。
 * <p>
 * 4、总格：总格又称后运，影响人中年至晚年的命运。
 * <p>
 * 姓名总格数理的计算是“姓名笔画数的总和“，这很好理解。如“丁不三“的总格数理是8(丁2画+不3画+三3画)，“东方长红“的总格数理是29(东8画+方4画+长8画+红9画)。
 * <p>
 * 5、外格：外格数影响命运之灵活力。
 * <p>
 * 单姓“将姓名总格数理减去人格数理之差再加1“即为外格(也可以直接将名字的最后一字的画数+1)，如“刘德华“的外格数理为15(总格44-人格30+1，华14画+1)；复姓“将姓名总格数理减去人格数理之差“即为外格。注意：单姓单名的外格数理为2，复姓单名的地格数理为“总格数理-人格数理+1“，单字一般不看外格的。
 */


import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/**
 * 五格数理暗示分类
 * <p>
 * 一、吉祥运暗示数(表示健全、幸福、名誉等)1、3、5、7、8、11、13、15、16、18、21、23、24、25、31、32、33、35、37、39、41、45、47、48、52、57、61、63、65、67、68、81
 * <p>
 * 二、次吉祥运暗示数(表示多少有些障碍，但能获得吉运)6、17、26、27、29、30、38、49、51、55、58、71、73、75
 * <p>
 * 三、凶数运暗示数(表示逆境、沉浮、薄弱、病难、困难、多灾等)2、4、9、10、12、14、19、20、22、28、34、36、40、42、43、44、46、50、53、54、56、59、60、62、64；
 * <p>
 * 四、首领运暗示数(智慧仁勇、立上位、能领导众人)3、13、16、21、23、29、31、37、39、41、45、47
 * <p>
 * 五、财富运暗示数(多钱财、富贵、白手可获巨财)15、16、24、29、32、33、41、52
 * <p>
 * 六、艺能运暗示数(富有艺术天才，对审美、艺术、演艺、体育有通达之能)13、14、18、26、29、33、35、38、48
 * <p>
 * 七、女德运暗示数(具有妇德，品性温良，助夫爱子)5、6、11、13、15、16、24、32、35
 * <p>
 * 八、女性孤寡运暗示数(难觅夫君，家庭不和，夫妻两虎相斗，离婚，严重者夫妻一方早亡)21、23、26、28、29、33、39
 * <p>
 * 九、孤独运暗示数(妻凌夫或夫克妻)4、10、12、14、22、28、34
 * <p>
 * 十、双妻运暗示数5、6、15、16、32、39、41
 * <p>
 * 十一、刚情运暗示数(性刚固执、意气用事)7、17、18、25、27、28、37、47
 * <p>
 * 十二、温和运暗示数(性情平和、能得上下信望)5、6、11、15、16、24、31、32、35
 */
public class ShuLiChecker {

    public static CATEGORY check(String name) {
        if (name != null && name.length() > 1) {
            CATEGORY categoryTianGe = sCheckerTianGe.check(name);
            CATEGORY categoryRenGe = sCheckerRenGe.check(name);
            CATEGORY categoryDinGe = sCheckerDiGe.check(name);
            CATEGORY categoryZongGe = sCheckerZongGe.check(name);
            CATEGORY categoryWaiGe = sCheckerWaiGe.check(name);

            if (categoryTianGe == CATEGORY.CAT_JIXIANG
                    && categoryRenGe == CATEGORY.CAT_JIXIANG
                    && categoryDinGe == CATEGORY.CAT_JIXIANG
                    && categoryZongGe == CATEGORY.CAT_JIXIANG
                    && categoryWaiGe == CATEGORY.CAT_JIXIANG) {
                return CATEGORY.CAT_JIXIANG;
            }else if (categoryTianGe == CATEGORY.CAT_HALFJIXIANG
                    && categoryRenGe == CATEGORY.CAT_HALFJIXIANG
                    && categoryDinGe == CATEGORY.CAT_HALFJIXIANG
                    && categoryZongGe == CATEGORY.CAT_HALFJIXIANG
                    && categoryWaiGe == CATEGORY.CAT_JIXIANG) {
                return CATEGORY.CAT_HALFJIXIANG;
            }
        }
        return CATEGORY.CAT_UNKOWN;
    }

    public static enum CATEGORY {
        CAT_JIXIANG,
        CAT_HALFJIXIANG,
        CAT_LEADER,
        CAT_MONEY,
        CAT_TECH,
        CAT_NVDE,
        CAT_UNKOWN,
    }

    public static TianGeChecker sCheckerTianGe = new TianGeChecker();
    public static RenGeChecker sCheckerRenGe = new RenGeChecker();
    public static DiGeChecker sCheckerDiGe = new DiGeChecker();
    public static ZongGeChecker sCheckerZongGe = new ZongGeChecker();
    public static WaiGeChecker sCheckerWaiGe = new WaiGeChecker();

    public static BihuaTest sBihuaTools = new BihuaTest();

    public static int[] sJiXiang = new int[]{1, 3, 5, 7, 8, 11, 13, 15, 16, 18, 21, 23, 24, 25, 31, 32, 33, 35, 37, 39, 41, 45, 47, 48, 52, 57, 61, 63, 65, 67, 68, 81};
    public static int[] sHalfJiXiang = new int[]{6,17,26,27,29,30,38,49,51,55,58,71,73,75};
    public static int[] sLeader = new int[]{3,13,16,21,23,29,31,37,39,41,45,47};
    public static int[] sMoney = new int[]{15,16,24,29,32,33,41,52};
    public static class TianGeChecker {
        public CATEGORY check(String name) {
            if (name != null && name.length() > 0) {
                try {
                    int bihua = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(0))) + 1;
                    if (Arrays.binarySearch(sJiXiang, bihua) > 0) {
                        return CATEGORY.CAT_JIXIANG;
                    }else if (Arrays.binarySearch(sHalfJiXiang, bihua) > 0) {
                        return CATEGORY.CAT_HALFJIXIANG;
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return CATEGORY.CAT_UNKOWN;
        }
    }

    public static class RenGeChecker {
        public CATEGORY check(String name) {
            if (name != null && name.length() > 1) {
                try {
                    int bihuaXing = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(0)));
                    int bihuaMingFirst = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(1)));
                    if (Arrays.binarySearch(sJiXiang, bihuaXing + bihuaMingFirst) > 0) {
                        return CATEGORY.CAT_JIXIANG;
                    }else if (Arrays.binarySearch(sHalfJiXiang, bihuaXing + bihuaMingFirst) > 0) {
                        return CATEGORY.CAT_HALFJIXIANG;
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return CATEGORY.CAT_UNKOWN;
        }
    }

    /**
     * 3、地格：地格数又称前运，影响人中年以前的活动力。
     * <p>
     * 单姓和复姓的地格数理都是“名字的笔画数相加“，如单姓双名“刘德华“的地格数理是29(德15画+华14画)；复姓双名“东方长红“的地格数理是17(长8画+红9画)。单名(如：王华、司马光)又该如何计算地格数理呢?单名的地格数理是“名的笔画数+1“，即“王华“的地格是16(华15画+1)，“司马光“的地格数理是7(光6画+1)。
     */
    public static class DiGeChecker {
        public CATEGORY check(String name) {
            if (name != null && name.length() > 1) {
                try {
                    int totalBiHua = 0;
                    int bihuaMingFirst = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(1)));
                    if (name.length() == 2) {
                        totalBiHua = bihuaMingFirst + 1;
                    } else {
                        int bihuaMingSecond = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(2)));
                        totalBiHua = bihuaMingFirst + bihuaMingSecond;
                    }
                    if (Arrays.binarySearch(sJiXiang, totalBiHua) > 0) {
                        return CATEGORY.CAT_JIXIANG;
                    }else if (Arrays.binarySearch(sHalfJiXiang, totalBiHua) > 0) {
                        return CATEGORY.CAT_HALFJIXIANG;
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return CATEGORY.CAT_UNKOWN;
        }
    }

    public static class ZongGeChecker {
        public CATEGORY check(String name) {
            if (name != null && name.length() > 1) {
                try {
                    int totalBiHua = 0;
                    int bihuaXing = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(0)));
                    int bihuaMingFirst = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(1)));
                    if (name.length() == 2) {
                        totalBiHua = bihuaXing + bihuaMingFirst;
                    } else {
                        int bihuaMingSecond = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(2)));
                        totalBiHua = bihuaXing + bihuaMingFirst + bihuaMingSecond;
                    }
                    if (Arrays.binarySearch(sJiXiang, totalBiHua) > 0) {
                        return CATEGORY.CAT_JIXIANG;
                    }else if (Arrays.binarySearch(sHalfJiXiang, totalBiHua) > 0) {
                        return CATEGORY.CAT_HALFJIXIANG;
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return CATEGORY.CAT_UNKOWN;
        }
    }

    /**
     * 5、外格：外格数影响命运之灵活力。
     * <p>
     * 单姓“将姓名总格数理减去人格数理之差再加1“即为外格(也可以直接将名字的最后一字的画数+1)，如“刘德华“的外格数理为15(总格44-人格30+1，华14画+1)；复姓“将姓名总格数理减去人格数理之差“即为外格。注意：单姓单名的外格数理为2，复姓单名的地格数理为“总格数理-人格数理+1“，单字一般不看外格的。
     */
    public static class WaiGeChecker {
        public CATEGORY check(String name) {
            if (name != null && name.length() > 1) {
                if (name.length() == 2) {
                    return CATEGORY.CAT_JIXIANG;
                }
                try {
                    int bihuaMingSecond = sBihuaTools.GetStrokeCount(String.valueOf(name.charAt(2))) + 1;
                    if (Arrays.binarySearch(sJiXiang, bihuaMingSecond) > 0) {
                        return CATEGORY.CAT_JIXIANG;
                    }else if (Arrays.binarySearch(sHalfJiXiang, bihuaMingSecond) > 0) {
                        return CATEGORY.CAT_HALFJIXIANG;
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return CATEGORY.CAT_UNKOWN;
        }
    }
}
